我們來看看以下的字串比較

void stringCompareTest(){
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);
        System.out.println("abc" == s1);
    }

會顯示什麼呢?

1.true/false?
2.true/treue?
3.false/true?
4.false/false?
答案是2

看起來是兩個相同型別的物件(字串)值為 "abc"應該很好理解

我們來看下一個範例

void stringCompareTest(){
        String o1 = new String("abc");
        String o2 = new String("abc");
        System.out.println(o1 == o2);
        System.out.println("abc" == o1);
        }

會顯示什麼呢?
1.true/false?
2.true/treue?
3.false/true?
4.false/false?
答案是4

o1 和 o2 第1個範例來講不是很像嗎?
但是差別在new 出1個物件。
以生活化的例子來說,買2片雞排1片75塊。
這2個雞排是完全獨立的2個雞排,不會是相同的。
雞排 o1 =new 雞排(75);
雞排 o2 =new 雞排(75);
相等的是價格!
可能例子不好,突然想到的XD

那 "abc" 和 o1為什麼是flase?
依據剛上面的說明大家應該可以想到,
o1是物件,而"abc"是值,所以2者不相同

那我們要怎麼做值的比較呢?

  1. o1.equals(o2);
  2. StringUtils.equals(o1,o2);

StringUtils 是1個另外的套件需要依賴注入
我們可以去這個網站下搜尋我們想要注入的套件https://mvnrepository.com/

點擊pom.xml
在中加入找的套件,如下方範例

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
</dependencies>

像是最一開始有說明spring web、lombok 如果沒有選到其去後續也可以另外注入
就是透過以上的方式。

說回來上方兩個方法可以進行值的比對
那回歸一下

我相信有些人可能已經混亂了
為什麼最一開始讀
String s1 = "abc";
String s2 = "abc";
s1==s2 true?
"abc" == s1 true?

"abc" == s1
這不是也是 "abc" 值和s1物件相比嗎,為什麼不是false?
String 字串這個型別比較特別,你可以想像一下他有一個 字串池(String pool)
只要 "這樣寫出來" 字串都是唯一的,不會因為你用不同的物件去接就是不同物件。
我們也可以理解成,當"這樣寫出來" 已經有1位置存放,之後不是new出來的物件。
都還是使用原來的字串(指向那個字串)。

因此"abc" 已經在String pool(字串池)然後有其他物件去接/指向它,所以直接比較都會是相同的。
像是第2個範例,因為new 出來表示有新的位置存放它。就和String pool內的""不相同了

希望這樣的說明清楚地讓大家了解這些微的差異

下一篇和大家說明一下如何進行比較

補充:

這不是一個給新手的一個教學過程,也寫的不是很完整
希望大家多多包涵囉~

主要是給自己的一個紀錄,也分享給有需要的夥伴

這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。

#java 17 #spring boot







你可能感興趣的文章

Rails API 學習紀錄 (Part 1)

Rails API 學習紀錄 (Part 1)

Stripe Follow Along Dropdown

Stripe Follow Along Dropdown

Inside look at modern web browser

Inside look at modern web browser






留言討論